АЗЫ ПРОГРАММИРОВАНИЯ

Данное пособие поможет изучить основные приемы программирования. Приводятся примеры программ, советы, разбор типовых алгоритмов. Каждая тема имеет задания, которые нужно выполнить самостоятельно.
Предназначено для поддержки предмета "Введение в специальность" специальности "Программист", курса "Компьютерная грамотность" для прочих специальностей, а также для самостоятельного изучения основ программирования.
Примеры программ приведены на языке АБАК. Описание языка и интерпретатора см. далее по тексту.


Содержание

 


Введение

Пособие включает описание ряда основных приемов программирования. Примеры программ и фрагментов включают обработку числовой, текстовой информации, календарных дат, графики. Используются структуры данных - одномерные и многомерные массивы. Программы можно делить на логически обособленные блоки - подпрограммы. Используется ступенчатая форма записи операторов для выделения их структуры.

Описание языка приведено в конце пособия. Оно может использоваться для справки. По мере изложения также приводятся пояснения к используемым возможностям языка.

Надеемся, что пособие поможет в изучении программирования, формировании алгоритмического мышления, использования компьютера в решении практических задач.


Вычислительные задачи

Большинство задач, которые мы решаем с помощью компьютера так или иначе связаны с вычислениями. В языке АБАК для простых вычислений достаточно написать выражение и нажать кнопку или F9 на клавиатуре. На экране тут же появится результат.

В выражениях используются знаки операций +, -, *, / и числа. Многие языки еще имеют возведение в степень, в том числе и АБАК. выражение 2^3 возведет число 2 в степень 3 (это все равно, что перемножить 2*2*2). Для извлечения корня нужно возвести число в дробную степень. Например:

2^(1/2)
2^0.5

Оба выражения дадут то же значение, что и

Порядок вычислений определяется приоритетами операций, принятыми в математике: Сначала делается возведение в степень, затем умножение и деление, в конце сложение и вычитание. Чтобы изменить этот порядок используются скобки. Проверьте, какими будут результаты выражений:

2+2*2
(2+2)*2
2+2^2

Для хранения промежуточных результатов удобно использовать переменные. Имя переменной представляет собой букву или слово. В имени переменной могут быть и цифры, только начинаться имя должно с буквы. В языке АБАК для имен переменных можно использовать не только английские буквы (как в большинстве языков программирования), но и русские. Для того, чтобы задать значение переменной применяется оператор присваивания. Его форма такова:

ИМЯ = ВЫРАЖЕНИЕ

Приведем задачу: За 2 кг апельсинов заплатили 14 рублей. Сколько стоит 5 кг?

C = 14 / 2
C
C * 5

Данная программа выдаст 2 числа - цену одного кг и стоимость 5 кг. Результат будет понятней, если его снабдить надписями:

C = 14 / 2
"Цена = " ; C
"Стоимость 5 кг = " ; C * 5

В обоих программах переменная C обозначает цену килограмма.

Запрограммируйте вычисления по известным формулам:

  1. Найдите среднее арифметическое двух чисел.
  2. Вычислите площадь треугольника.
  3. Определите сопротивление двух резисторов, соединенных параллельно.
  4. Сколько байт потребуется для хранения рисунка заданных размеров и числа цветов (без сжатия).
  5. По теореме Пифагора вычислите гипотенузу прямоугольного треугольника с заданными катетами.

Ввод-вывод

Приведенные выше примеры трудно назвать полноценными программами. Программист, как правило, стремится написать универсальную программу, которая будет решать не одну задачу, а целое семейство аналогичных задач.

Программа должна быть универсальной!

Оператор ввода позволяет изменять значения переменных во время выполнения, не изменяя текст программы. Он имеет две формы:

INPUT ИМЯ

INPUT "ПОЯСНЕНИЕ";ИМЯ

Приведем пример программы для решения задач определения цены и стоимости товаров:

INPUT D
INPUT W
C = D / W
PRINT C
INPUT W
PRINT C * W

Если запустить программу, то появится запрос на ввод переменной D (стоимости), затем W (веса), после чего на экране появится цена, а затем повторно появится запрос веса. В конце Вы получите стоимость введенного веса товара.

Без приведенного выше пояснения трудно разобраться, для чего предназначена программа.

Программа должна быть понятной пользователю!

Снабдим нашу программу надписями. Теперь легче понять, что делает программа.

INPUT "Сколько стоит товар?"; D
INPUT "Сколько весит товар?";W
C = D / W
PRINT "Цена = ";C
INPUT "Каков новый вес товара?";W
PRINT "Столько товара стоит ";C * W

Вспомним, что в языке АБАК-БЕЙСИК можно использовать русские имена переменных и перепишем программу еще раз.

Программа должна быть понятна программисту!

Помимо осмысленных имен переменных улучшению понятности программы способствуют комментарии. В языке АБАК-БЕЙСИК комментарий начинается словом REM, за которым могут находиться любые символы до конца строки. Комментарий не влияет на выполнение программы.

REM Вычисление цены и стоимости товара
INPUT "Сколько стоит товар?"; Деньги
INPUT "Сколько весит товар?"; Вес
Цена = Деньги / Вес
PRINT "Цена = "; Цена
INPUT "Каков новый вес товара?"; Вес
PRINT "Столько товара стоит "; Цена * Вес

Теперь программа понятна не только пользователю (тому, кто будет применять ее), но и программисту. Особенно важно делать программу удобочитаемой, если над проектом работает не один программист, а целый коллектив. Убедитесь, что два последних примера работают абсолютно одинаково.

Для закрепления знаний напишите несколько программ:

  1. Вычислите объем параллелепипеда.
  2. Увеличьте сумму на заданное число процентов.

 

Условия и логика

Условия (или ветвления) нужны, чтобы выполнить (или обойти) участок программы в зависимости от значений переменных. Алгоритмы, содержащие условия называют разветвленными. В противовес им алгоритмы без условий называют линейными (все операторы можно выполняются друг за другом, в порядке написания). Типичным примером разветвленной программы послужит программа вычисления сдачи.

REM Вычисление сдачи
INPUT "Сколько стоит товар?"; Товар
INPUT "Сколько имеется денег?"; Деньги
IF Деньги > Товар
  PRINT "Сдача = "; Деньги - Товар
ENDIF

Оператор PRINT будет выполнен, если число денег превышает стоимость товара. Усложним программу, чтобы она выдавала сумму нехватки денег.

REM Вычисление сдачи. Версия 2
INPUT "Сколько стоит товар?"; Товар
INPUT "Сколько имеется денег?"; Деньги
IF Деньги < Товар
  PRINT "Не хватает ";Товар - Деньги
ELSE
  PRINT "Сдача = "; Деньги - Товар
ENDIF

Операторы, стоящие за словом ELSE будут выполняться, когда условие ложно. В языке АБАК-БЕЙСИК слово ELSE пишется на отдельной строке. Слово ENDIF завершает условие. Если после него стоят операторы, они будут выполняться независимо от результата условия.

Доработайте программу вычисления сдачи, чтобы она запрашивала цену и количество товара, требовала доплату при нехватке денег.

Циклы

Серию повторяющихся операторов называют циклом. Циклы позволяют значительно уменьшить объем программы.

Программа должна быть как можно более компактной!

Если заранее известно число повторений цикла, то используют цикл FOR. Простейшая программа с циклом повторит несколько раз одну фразу.

FOR K=1 TO 3
  PRINT "Ура!"
NEXT K

Внутри цикла можно использовать переменную, которая является счетчиком повторений. Важно лишь следить за тем, чтобы она в цикле FOR не изменила своего значения. В этом случае возможна ситуация, когда цикл будет продолжаться бесконечно долго, программа зациклится.

Программа не должна содержать бесконечных циклов!

Ниже приведен текст программы, которая печатает таблицу умножения на 2.

REM Таблица умножения на 2
FOR K=2 TO 10
  PRINT "2 * "; K; " = "; 2 * K
NEXT K

А что, если нужно напечатать всю таблицу умножения от 2 до 10? Для этого нам понадобится еще один цикл. Такие циклы называют вложенными.

REM Таблица умножения
FOR N=2 TO 10
  FOR K=2 TO 10
    PRINT N; " * "; K; " = "; N * K
  NEXT K
NEXT N

Обратите внимание, что строки программы написаны "лесенкой". Эта форма записи облегчает чтение программы и поиск ошибок программистом. Как только структура начинается, делается отступ вправо, а когда она заканчивается - влево. Программисту легко увидеть начало и окончание сложного структурного блока.

Как быть, если число повторений цикла заранее неизвестно? Здесь используется цикл WHILE. В начале находится условие, которое проверяется перед каждым проходом цикла. Если оно ложно, то цикл завершается и управление передается оператору, следующему за словом WEND. Приведем пример программы, которая повторяет ввод числа до тех пор, пока оно не совпадет с проверяемым.

REM Числовой тест
N=0
WHILE N<>5
    INPUT "Сколько пальцев на руке?"; N
WEND
PRINT "Верно."

Как видно, программа несложная. Ее можно улучшить, добавив внутрь цикла счетчик числа попыток. Кроме того, это избавит от зацикливания (Если попадется тот, у кого нет одного пальца).

REM Числовой тест 2
N = 0
P = 0
WHILE (N<>5) & (P<4)
    INPUT "Сколько пальцев на руке?"; N
    P = P + 1
WEND
IF P<4
    PRINT "Верно."
ELSE
    PRINT "Число попыток истекло!"
ENDIF

Цикл WHILE очень коварен. Он не имеет своего счетчика, как цикл FOR, программист должен позаботиться о том, чтобы внутри цикла были операторы, влияющие на условие продолжения. Еще одна проблема состоит в том, что нужно обязательно задать начальные значения для условия, иначе цикл не выполнится ни разу. Попробуйте во второй строке присвоить переменной N значение 5 и Вы сами в этом убедитесь.

Относительно циклов вообще приведем еще одно замечание. Внутри циклов не должно быть много операторов. Так как цикл повторяется многократно, то лишние операторы в циклах приводят к замедлению работы программы. Особенно это касается операторов ввода-вывода.

Программа должна работать достаточно быстро!

Задания:

  1. Напишите программу, которая проверяла-бы знания таблицы умножения. Сделайте игру, в которой компьютер загадывает число (при помощи функции RND), а затем определяет, сколько попыток потребуется на его отгадывание.Попробуйте написать обратную игру, где компьютер будет отгадывать числа.
  2. Разработайте программу, выдающую таблицу значений функции, например sin или cos.
  3. Напришите программу, печатающую таблицу перевода единиц измерения, например фунты в килограммы, градусы в радианы и т.п.

Символы и строки

Программы могут обрабатывать не только числа, но и буквы (а также и другие символы). Вставка поясняющих фраз в операторы ввода-вывода уже не раз использовалась в примерах программ. Строковые значения можно присваивать переменным, как и числовые. Строка должна быть указана в кавычках.

Имя = "Вася"
PRINT "Здравствуй, ";Имя

Для универсальности программы часто удобнее вводить строки при выполнении программы. Переработаем программу таким образом, чтобы можно было вводить имя.

INPUT "Как Вас зовут?"; Имя
PRINT "Здравствуй, ";Имя

Напишите программу, которая продолжит диалог, задаст и другие вопросы.

Каждый символ в компьютере имеет свой числовой код. Простая циклическая программа поможет узнать код каждого символа.

FOR K=32 TO 255
  PRINT K;" = ";CHR(K)
NEXT K

Обратите внимание, что коды символов начинаются с 32 (Кстати, 32 - это код пробела). Коды до 32 обозначают управляющие символы, например 13 - клавиша ENTER (Переход на новую строку).

Строки можно сравнивать, как и числа. В языке АБАК-БЕЙСИК для этого предусмотрены специальные команды: знак ~ заменяет знак равенства. Перед сравнением строки приводятся к одному регистру, например выражение
"Вася" ~ "ВАСЯ"
даст истинный результат. Знак # означает команду НЕ РАВНО. Он также приводит строки к одному регистру перед сравнением. Вот пример программы, где использовано сравнение строк.

INPUT "Вам нравится мороженое?"; Ответ
IF Ответ ~ "ДА"
  PRINT "Да, многие программисты любят мороженое."
ENDIF

Для тренировки Вам предлагается самостоятельно написать несколько программ.

Задания:

  1. Придумайте программу, которая при вводе заданного имени выдает определенную фразу.
  2. Запрограммируйте какой-нибудь тест (из психологии или на определение знаний), чтобы после ввода всех ответов была выдана оценка или заключение.

Массивы

Обычнык переменные называют именем одну ячейку памяти, а массивы - сразу несколько. Массив можно сравнить со шкафом, полки которого пронумерованы. Использование массивов вместе с циклами значительно сокращает объем программы. Вот пример фрагмента программы, который вводит несколько сумм.

INPUT "Сколько товаров?"; N
FOR K = 1 TO N
  INPUT "Сумма?"; A[K]
NEXT K

Каждый раз при проходе цикла значение переменной K увеличивается на 1. Первый раз мы вводим A[1], затем A[2] и т.д.

С массивами связан ряд классических алгоритмов суммирования, поиска, сортировки. Ниже приведен алгоритм суммирования. Обратите внимание, что переменная суммы должна быть заранее обнулена. В ряде версий Бейсика это делать не нужно, так как все неописанные переменные равны нулю. Язык АБАК-БЕЙСИК требует описания переменных путем присваивания значений.

Программа не должна иметь неопределенностей!

Для определенности следует всегда явно задавать начальные значения переменным.

REM Вычисление суммы массива
INPUT "Сколько товаров?"; N
FOR K = 1 TO N
  INPUT "Сумма?"; A[K]
NEXT K
S = 0
FOR K = 1 TO N
  S = S + A[K]
NEXT K
PRINT "Итого = ";S

Данную программу можно переписать и без массива. Кроме того, можно обойтись одним циклом. Если суммы товаров в дальнейшем нужны для других целей (например для вычисления максимума и т.д., то без массива не обойтись, иначе придется вводить все суммы заново)

Следует разумно использовать возможности языка!

В данном примере переменная A используется многократно внутри цикла.

REM Вычисление суммы без массива
INPUT "Сколько товаров?"; N
S = 0
FOR K = 1 TO N
  INPUT "Сумма?"; A
  S = S + A
NEXT K
PRINT "Итого = ";S

А вот в сортировке без массива не обойтись. Допустим, требуется распределить товары в порядке возрастания цены. Заметьте, что в программе использовано два массива, один для названий товаров, другой для цен.

REM Сортировка массивов
INPUT "Сколько товаров?"; N
FOR K = 1 TO N
  INPUT "Название товара?"; A[K]
  INPUT "Цена товара?"; B[K]
NEXT K
FOR N = 1 TO N-1
FOR K = 1 TO N-1
IF B[K]>B[K+1]  
  TA = A[K] 
  A[K] = A[K+1]
  A[K+1] = TA
  TB = B[K] 
  B[K] = B[K+1]
  B[K+1] = TB
NEXT K
NEXT N
FOR K = 1 TO N
  PRINT TAB(A[K]);" : ";KOP(B[K])
NEXT K

Данный алгоритм сортировки не является лучшим, есть и другие алгоритмы, более быстрые. В базах данных кроме того применяются индексы, которые упорядочиваются вместо самих ячеек с данными, что еще ускоряет сортировку.

Массивы могут быть многомерными. В языке АБАК-БЕЙСИК измерения разделяют двоеточием. Например, в классе 6 рядов по 5 мест. Имя ученика на каждом месте можно описать элементом массива N[X:Y], где X - номер ряда, Y - номер места в ряду. Для работы с многомерными массивами используют вложенные циклы. Учтите, что многомерные массивы требуют много памяти для хранения значений, например, наш массив будет иметь 30 значений.

REM Ввод двухмерного массива
INPUT "Сколько рядов в классе?"; R
INPUT "Сколько мест в ряду?"; M
FOR Y = 1 TO R
  FOR X = 1 TO M
    PRINT "Ряд:"; Y ; "- Место:";X
    INPUT "Имя?"; N[X:Y]
  NEXT X
NEXT Y

Так как массивы в языке АБАК-БЕЙСИК динамические, то нет нужды описывать заранее размер массива, поэтому, удобно адреса элементов представлять в виде переменных, что ведет к большей универсальности программ. Это виднов предыдущем примере.

Задания:

Подпрограммы

Повторяющиеся фрагменты программы, если они вызываются из разных мест удобно оформить в виде подпрограмм. Это сократит объем программы. А еще, разбив программу на блоки (подпрограммы) вы облегчите себе труд по отладке. Накапливая подпрограммы для типовых операций (сортировки, поиска и др.) Вы сможете вставлять их в другие проекты и сократите время на разработку. В языке АБАК, как и в первых версиях языка БЕЙСИК переход к подпрограмме делается оператором GOSUB, а возврат из подпрограммы - RETURN. Подпрограммы принято размещать в конце, а для того, чтобы не было перехода к подпрограмме без вызова, между текстом программы и подпрограммы ставят оператор STOP.

REM Опрос с подпрограммой
R = 0
PRINT "Сколько пальцев на руке?"
N = 5
GOSUB Ответ
PRINT "Сколько пальцев на двух руках?"
N = 10
GOSUB Ответ
IF R=2
  PRINT "Молодец"
ELSE
  PRINT "Число ошибок = ";R - 2
ENDIF
STOP

SUB Ответ
P = 0
WHILE P<>N
  INPUT "Ваш ответ?";P
  R = R + 1
WEND
RETURN

Здесь в виде подпрограммы оформлен ввод и анализ ответа. Обратите внимание, что переменные в языке АБАК-БЕЙСИК свободно передают свои значения как в подпрограммы, так и из них. То есть программа и подпрограммы имеют единое адресное пространство. Это удобно для небольших проектов. В больших программах становится трудно отследить изменения значений переменных, поэтому, большинство современных профессиональных языков программирования имеют еще и локальные переменные, которые существуют только в подпрограммах.

Задания:

  1. Напишите программы для печати текстов известных песен, припевы оформите в виде подпрограмм.
  2. Оформите в виде подпрограмм алгоритмы ввода, вывода, сортировки массива.

Оформление программы

Программа, особенно та, которая разрабатывается для других людей, должна быть оформлена по правилам:

В языке АБАК имеются некоторые средства для оформления программы.

Название программы можно написать оператором PRINT в начале текста, номер версии, дату разработки и свои координаты можно оформить оператором REM также в начале программы, если Вы не желаете, чтобы они показывались на экране во время работы программы.

Эстетичное оформление программы можно получить вставкой рисунков при помощи оператора IMAGE

В версии 3 и выше имеется ряд графических операторов, которые помогут вычертить на экране различные фигуры.

LINE x1 : y1 TO x2 : y2 - вычертит линию

CIRCLE r TO x : y - вычертит окружность радиуса r из центра x, y

COLOR цвет - установить новый цвет для рисования и текста

FONT шрифт - изменить параметры шрифта - название, наклон, величину

Обработку ошибок пользователя удобно помещать в цикл WHILE, чтобы пользователь имел возможность исправить свою ошибку. Функция ISN проверяет, ввел ли пользователь число. Вот пример фрагмента программы с проверкой.

N = ""
WHILE NOT(ISN(N))
  PRINT "Введите число:"; N
WEND

Номер версии программы обычно указывают двумя числами через точку.
Например: Версия 5.23
Нумерация версий производится в порядке возрастания. Причем, при внесении глобальных изменений меняют первое число, а второе обнуляют. При внесении небольших доработок увеличивают второе число. Так Вы никогда не запутаетесь в копиях своей программы. Ниже приведена программа со справкой и номером версии.

REM Пример программы с рисунком
CLS
PRINT "Программа ничегонеделания"
PRINT "Версия 2.25"
PRINT "Автор Петров П.П. "
PRINT " 2001 г."
IMAGE Proba TO 100:100

Для успешного выполнения данной программы необходимо, чтобы в папке программы был файл рисунка PROBA.BMP. Вы можете легко нарисовать его в редакторе PAINT среды WINDOWS. Лучше, если рисунок сделать небольшим.

Сложные программы обычно имеют встроенную справку. Пользователь, нажав клавишу F1 получает на экране текст, поясняющий назначение программы. В среде АБАК Вы можете сформировать текст справки, используя оператор PRINT HELP. Чтобы убрать справку по языку, используйте оператор CLS HELP.

Задания:

  1. Напишите номера версий, справку и другие необходимые реквизиты в свои программы.

  2. Попытайтесь написать программу, которая включала-бы последовательный показ рисунков.

Календарь

Многие задачи, особенно связанные с учетом, используют в работе дату и время. В языке АБАК для этого имеются функции:

DATE - число и месяц

YEAR - год

TIME - час и минута

MOMENT - секунды и сотые доли секунд с начала дня

Комбинируя эти функции легко получить текущую дату и время. Вот пример их использования

PRINT "Сегодня:";Date;".";Year
PRINT "Время:";Time

Для выдачи даты и времени используются встроенные часы, имеющиеся в каждом компьютера. Если выдаются неверная дата или время, то нужно установить часы. Это легко делается в системе Windows.

С детой и временем можно работать так же, как и с обычными значениями: сравнивать их, производить вычисления, присваивать переменным. Вот пример, выдающий название месяца.

Мес[1]="январь"
Мес[2]="февраль"
. . .
PRINT Мес[(Date-int(Date))*100]

Функции TIME и MOMENT можно использовать для ограничения времени ответа на вопрос в компьютерных тестах.

Задания:

  1. Напишите программу ЧАСЫ, которая выдает время в цикле.

  2. Напишите программу, сообщающую, имеется ли сегодня (или завтра) какой-нибудь праздник.

  3. Вычислите, сколько дней осталось до Вашего дня рождения.

 

Динамика

Большинство программ, приведенных выше можно назвать статичными. Они терпеливо ждут, пока Вы введете значение переменной или прочтете текст. Имеется ряд задач, где этого недостаточно. Например, Вы желаете запрограммировать вывод бегущей строкой или управлять летящим самолетом

В языке АБАК имеется функция INKEY, которая принимает ввод с клавиатуры без остановки программы. Ознакомьтесь с ней на примере программы, которая сообщает коды нажимаемых клавиш.

A = ""
WHILE ORD(A)<>13
  A = INKEY
  IF ORD(A)<>0
    PRINT A; " = ";ORD(A)
  ENDIF
WEND

Запустив эту программу проверьте коды нажимаемых кнопок. Вы заметили, что не все клавиши воспринимаются, кроме того, код зависит от регистра и языка. Это так называемые коды высокого уровня, которые передает операционная система. Есть также коды низкого уровня или СКАН-КОДЫ, которые передаются контроллером клавиатуры операционной системе. Система обрабатывает СКАН-КОД и выдает код символа, который сообщается прикладной программе. Некоторые программы могут работать напрямую со СКАН-КОДАМИ.

Функция INKEY выдает только один символ. Несложная программа собирает несколько символов. Подобный алгоритм можно использовать для ввода пароля за определенный промежуток времени.

S = 1000
P = "123"
R = ""
FOR K = 1 TO S
  A = INKEY
  IF A#""
  R = R;A
  IF R~P
    PRINT "Верно."
  ENDIF
NEXT K
PRINT "Время истекло."

Для ограничения времени ввода используется цикл FOR. Этот подход имеет недостаток: на компьютерах с разным быстродействием программа работает разное время.

Задания:

  1. Напишите программу, которая выдает текст бегущей строкой.

  2. Попробуйте запрограммировать движущиеся объекты: автомобиль, бегущего человека, дождь, снег и др.

  3. Сделайте управляемый объект, нарпимер автомобиль или самолет.

Обработка знаний

Обычная программа всегда работает одинаково, сколько раз ее не запускай. Есть интересный класс программ, называемых экспертными системами, которые способны накапливать знания в ходе работы, то есть, самообучаться. На языке АБАК тоже можно создавать подобные программы.

При выполнении программы значения ряда переменных можно сохранить во внешнем файле. В следующем запуске программы файл можно загрузить и продолжить работу..

В версии языка АБАК 3.09 и более поздних имеется оператор EDIT, который предназначен для того, чтобы изменять текст программы прямо во время выполнения. Формат оператора таков:

EDIT номер строки TO новый текст строки

Программа, приведенная ниже, подсчитывает число запусков и выдает его на экран.

N = 0
N = N + 1
EDIT 1 TO "N="; N
PRINT "Запуск "; N

Работает эта программа следующим образом: В 1-й строке присваивается значение переменная N, во второй строке к старому значению прибавляется 1. Третья строка изменяет первую строку, записывая новое значение переменной. Последняя строка выдает на экран номер запуска. Важно, что если Вы сохраните проект и затем вновь откроете его (хотя-бы через неделю), значение переменной N сохранится и счет продолжится дальше. Кстати, сохранить проект можно и автоматически при выполнении, для этого добавьте оператор SAVE в конец программы.

Предыдущий пример хранил только одну переменную, а можно хранить даже целые массивы, еще и увеличивая их размеры по мере роста объема знаний. Здесь приведена программка, которая запоминает имена тех, кто ее использовал.

OPEN "NAMES.TXT" TO READ
M = 0
IF ISF
  WHILE NOT EOF
    M = M + 1
    READ NAMES[M]
  WEND
  CLOSE
END
INPUT "ВАШЕ ИМЯ?";NAME
T = 0
FOR K = 1 TO M
  IF NAME ~ NAMES[K]
    T = K
  ENDIF
NEXT K
IF T = 0
  PRINT "ВАШЕ ИМЯ МНЕ НЕЗНАКОМО,ЗАПОМНЮ"
  M = M + 1
  NAMES[M] = NAME
  OPEN "NAMES.TXT" TO WRITE
  FOR K=1 TO M
    WRITE NAMES[K]
  NEXT K
  CLOSE
ELSE
  PRINT "Я ЗНАЮ ВАШЕ ИМЯ"
ENDIF

В программе имеется массив Names, в котором хранятся имена, а переменная M содержит число элементов массива и ее значение увеличивается по мере заполнения массива. Введенное имя сравнивается со всеми именами массива и если такого нет, то добавляется. Перед первым запуском программы создайте файл NAMES.TXT , куда запишите какие-нибудь имена в столбик.

Задания:

  1. Доработайте программу запоминания имен, чтобы она знала еще и другие сведения для каждого имени.

  2. Вы можете разработать программу, которая содержит словарь иностранных слов. Если при поиске слово не обнаруживается, то пользователь может ввести его перевод и дополнить словарь.

Графика

Компьютерная графика имеет много различных областей использования. Различают деловую графику (построение диаграмм, карт и т.п.), проектирование деталей машиностроения и архитектурных сооружений, мультипликацию, трехмерное моделирование и др.

Рассмотрим пример построения столбчатой диаграммы.

REM Построение столбчатой диаграммы
PRINT "Введите 10 чисел (от 0 до 100)"
FOR K=1 TO 10
  INPUT A[K]
NEXT K
CLS
LINE 100:100 TO 600:100
LINE 100:200 TO 600:200
LINE 100:300 TO 600:300
FOR K=1 TO 10
  X=K*50+50
  Y=300-A[K]*2
  BOX X:300 TO X+20:Y
NEXT K

Рассмотрим работу программы. Вначале вводится массив из 10-ти чисел. Затем, после очистки экрана рисуется 3 горизонтальных линии. В завершающем цикле оператором BOX рисуются прямоугольники, высота которых определяется введенными числами.

 

Задания:

  1. Разработайте программу, которая выведет на экран график функции синус.

  2. Доработайте пример рисования диаграммы, чтобы столбики имели тень.

  3. Попытайтесь сформировать трехмерные столбчатые диаграммы (объемного вида).

 

Советы

Список советов приведенных ранее в тексте, которые помогут сделать Ваши программы лучше:

Советов можно привести еще много. Вот самый важный совет:

Учитесь программировать программируя!

Нельзя научиться программировать только путем чтения книг или даже разбором примеров программ, хотя без этого не обойтись. Программируйте все, что видите вокруг, накапливайте опыт, собирайте примеры своих и чужих алгоритмов. Пытайтесь улучшить свои программы.


 

Интерпретатор АБАК

Языки программирования по методу исполнения программы условно делятся на компиляторы и интерпретаторы.

КОМПИЛЯТОР переводит программу в машинные коды и выполняет ее целиком. Как правило, откомпилированная программа отчуждается от исходного текста на языке программирования. Большинство продаваемых программ распространяется в машинных кодах (EXE-файлах). Преимущества этого метода трансляции заключается в том, что программа в кодах всегда готова к исполнению, выполняется быстро и не требует компилятора для этого. Дополнительно обеспечивается защита авторских прав, так как пользователи не имеют возможности изменить программу и даже посмотреть, как она устроена. Неудобства компилятора состоят в том, что при внесении даже небольших изменений требуется перекомпилировать всю программу. Кроме того, готовая к исполнению программа в кодах может иметь большой объем.

ИНТЕРПРЕТАТОР выполняет программу по командам. Выполнение начинается сразу после запуска и не требует предварительной компиляции. По мере выполнения интерпретатор переходит к следующим командам и т.д. до остановки программы. Текст программы, как правило, имеет небольшой объем, всегда доступен для просмотра и редактирования. Недостатками интерпретатора являются низкая скорость выполнения программы и доступность кода для редактирования (что неприемлемо для хранения конфиденциальных данных).

АБАК-БЕЙСИК является типичным интерпретатором.

Запустите интерпретатор ABAK.EXE . На экране появится окно, в котором можно начинать новую программу.

УПРАВЛЕНИЕ

- новый проект. Область программы очищается, проекту присваивается имя NEW.AB . Если интерпретатор только что запущен данную команду выполнять не нужно.

- открыть проект. Ранее разработанная и сохраненная на диске программа может быть открыта данной командой.

- сохранить проект. После написания программы ее нужно сохранить во внешней памяти (например, на винчестере или дискете), чтобы к ней можно было обратиться в другое время. Если программу не сохранить и завершить сеанс работы, то Ваши труды пропадут.

- отпечатать. В зависимости от того, что находится на экране, данная кнопка вызывает печать текста программы, результата ее выполнения, таблицы значений переменных, справки.

- запуск/остановка. Написанная программа по данной кнопке начинает выполняться. Кнопка остается нажатой, пока программа не закончит работу.

- номер строки. Это поле рядом с кнопкой запуска содержит номер строки программы, на которой стоит курсор во время написания программы или номер строки, которая сейчас выполняется после запуска программы. При получении сообщения об ошибке посмотрите, в какой строке она возникла. Это поможет быстрее найти и ликвидировать ошибку.

- текст программы. Открывает текст программы, если Вы просматривали результат, переменные или справку. Кнопка остается нажатой.

- текст результата. При выполнении программа сама переключается на текст результата. После завершения выполнения Вы всегда можете используя кнопку вернуть экран результата и посмотреть его.

- переменные. Иногда интересно посмотреть, что находится в памяти машины при выполнении программы или после ее завершения. Данная кнопка поможет это сделать. Особенно важно исследовать значения переменных после получения сообщения об ошибке.

- справка. Выдается краткая справочная информация по языку АБАК-БЕЙСИК. Если Вы забыли, как пишется тот или иной оператор, нажмите кнопку справки.

Последние четыре кнопки являются зависимыми. При нажатии одной из них ранее нажатая кнопка отпускается. Таким образом, легко переходить между экранами программы, результата, переменных и справки в любое время.

 


Описание языка АБАК

Язык программирования АБАК - одна из вариаций языка БЕЙСИК. В противовес большинству современных версий языка БЕЙСИК, имеющих сотни операторов, язык АБАК отличается простотой, что значительно сокращает время его освоения.

Особенности реализацииязыка:

ВЫРАЖЕНИЯ

Знаки операций:
+,-,*,/ - арифметика
<,>,=,<>,<=,>= - сравнение чисел
~ - сравнение строк, игнорируя высоту букв, начальные и конечные пробелы.
# - (не равно) для символов
@ - позиция подстроки в строке
; - сцепляет значения вместе
: - несколько выражений рядом
$ - выдать символ по его коду
? - ИЛИ
& - И

Функции с параметром:

abs - модуль числа
atn - арктангенс (угол в радианах)
chr - выдает символ по коду как $
exp - экспонента
cos - косинус
first - первый символ строки
int - целая часть
kop - формат числа с копейками
isn - переменная содержит число
last - выдает строку без первого символа
len - число символов в строке
ln - натуральный логарифм
not - отрицание
ord - код первого символа строки
pstr - строка без последнего символа
rnd - целое случайное число, меньшее аргумента
sin - синус
tabXX - добавляет до XX пробелов
upc - переводит в заглавные буквы

Функции без параметров

date - число.месяц
eof - достигнут конец файла, или файл не открыт для чтения
inkey - символ с клавиатуры или номер кнопки мыши без ожидания
moment - время с начала дня в секундах и долях секунд
mousex, mousey - координаты мыши.
pi - число ПИ 3.1415....
scrl, scrh - размеры экрана
scry - позиция y для вывода текста
time - час.минута
year - год

Приоритеты операций

Операции Приоритеты
Функции (кроме NOT) 50
NOT 45
Унарный - (минус) 35
^ 25
* / 20
+ - 10
< > = <= >= # ~ 6
& 4
? 3
: ; 2

Порядок вычисления может быть изменен скобками ( )

Элементы массива отделяются прямыми скобками []

ОПЕРАТОРЫ*

* Примечание: после названий операторов через дробь могут следовать русскоязычные аналоги, например SET/УСТ . В программе можно произвольно употреблять как английские, так и русские названия.

имя = выражение - вычисление значения переменной

BOX x1:y1 TO x2:y2 - закрашенный прямоугольник.

CIRCLE r TO x:y - окружность.

CLS цвет - очистка экрана. доп.параметр - цвет экрана. Цвет может быть задан числом или названием. Название цвета указывается в кавычках.

COLOR цвет - установить цвет для последующих линий и текста.

Цвета:
"RED" - красный
"GREEN" - зеленый
"AQUA" - голубой
"LIME" - светло-зеленый
"YELLOW" - желтый
"BLUE" - синий
"GRAY" - серый
"BLACK" - черный
"WHITE" - белый

EDIT строка TO значение - изменить строку программы

FOR имя = нач TO кон - оператор цикла. Сокращенная форма допускает не указывать имя и начальное значение, например: FOR 10 - цикл выполнится 10 раз.

NEXT имя - окончание цикла FOR. Если оператор FOR был в сокращенной форме, то имя указывать не нужно.

GOSUB название - переход к подпрограмме

GOSUB ... ON имя - переход к подпрограмме по значению переменной.

RETURN - возврат из подпрограммы

IF лог.выражение - условие
ELSE - иначе
ENDIF - конец условия
Логические величины:
"TRUE" - истина
"FALSE" - ложь

IMAGE файл TO x:y - рисунок, координаты и TO можно опустить.

INPUT имя - ввод значения переменной.

LINE x1:y1 TO x2:y2 - линия в точку с координатами x2:y2

LOAD файл - загрузить и запустить новую программу.

OPEN файл [TO WRITE/APPEND/PRINT/READ] открыть файл данных [для перезаписи/дозаписи/печати/чтения]. Если параметр опущен, то файл открывается для чтения

PAINT цвет TO x:y - закрашивание области заданным цветом

PAUSE - вывод в отдельное окно и приостановка выполнения программы

PLAY файл - проигрывание музыки, видео файлов.

PRINT выражение - вывод на экран. Слово PRINT можно опустить.

PSET цвет TO x:y - точка

READ имя - прочитать из файла в переменную

REM - комментарий, данная строка не выполняется.

SAVE имя - сохранить проект. Если имя не задано, то старое.

STOP - остановка программы

SET/УСТ параметры - установки среды. Параметры:
- MIN - свернуть окно
- MID - сделать окно небольшим
- MAX - раскрыть окно на весь экран
- FULL/ПОЛН - полноэкранный режим (окно без заголовка)
- DIALOG - запретить изменять размеры окна за края мышью.
- PROF/ПРОФ - убрать кнопки верхней панели
- SPEED/УСКОР - прекратить трассировку
- SCROLL, NOSCROLL вкл или выкл.полосы прокрутки

SUB имя - начало подпрограммы

WEND - оконяание цикла ПОКА

WHILE лог.выражение - цикл ПОКА

WRITE - запись в файл

Сообщения интерпретатора:

Русскоязычные аналоги ключевых слов языка (с версии 5.00)

Операторы:
CLS=ОЧЭКР HELP=СПР
COLOR=ЦВЕТ
DIM=РАЗМ
END=КОНЕЦ
GOSUB=ВЫЗВАТЬ ON=ПО
IMAGE=РИС
INCLUDE=ВКЛЮЧИТЬ
INPUT=ВВЕСТИ
LET=ПУСТЬ
LINE=ЛИНИЯ TO=ДО
LOAD=ВЫПОЛНИТЬ
PAUSE=ПАУЗА
PRINT=ВЫВОД HEAD=ВЕРХ
REPEAT=ПОВТОР
RETURN=ВОЗВРАТ
RUN=ПУСК
SAVE=СОХРАНИТЬ
SET=УСТ
- PLAYER=КНОПКИ
- MIN=СВЕРНУТЬ
- MID=КОМПАКТ
- MAX=МАКС
- FULL=ПОЛН
SUB=ПРОЦ
UNTIL=ПОКА
WIDTH=ТОЛЩИНА

Функции:
TIME=ВРЕМЯ
DATE=ДАТА
WEEK=ДЕНЬНЕДЕЛИ
KOP=КОП
TAB=ТАБ

Цвета:
DARK=ТЕМНЫЙ
LIME=ИЗУМРУДНЫЙ
FACE=КНОПОК
SCREEN=ЭКРАНА
и др.

Ограничения реализации языка:

 


Разработал Матюхин А.Н.

Дата редактирования: 06.08.2005 г.

Версия языка АБАК: 5.02

Сайт управляется системой uCoz